/**
 *  封装一个调用请求的方法
 * 获取本地存储的用户认证令牌
 * 
 * @description 从本地存储中读取用户登录认证的token值
 * @returns {string|null} 返回存储的token字符串，如果不存在则返回null
 * @example
*/
import { getToken, removeToken, setToken } from '@/utils/auth'
const BASE_URL = '/api'// 基础URL，正式环境所有请求路径都将基于此URL
/**
 *  封装了一个调用请求的方法
 * @param {string} options.url - 请求路径，相对于基础URL
 * @param {string} [options.method='GET'] - HTTP请求方法，默认GET
 * @param {Object} [options.data={}] - 请求体数据，默认空对象
 * @param {Object} [options.headers={}] - 自定义请求头，默认空对象
 * @param {number} timeout  - 请求超时时间，单位毫秒，默认10000
 * @returns {Promise} 返回一个Promise对象，包含请求结果或错误信息
 */

// 不需要 token 的接口白名单
const WHITE_LIST = [
    '/auth/teacher-login',
    '/auth/teacher-register',
    '/auth/student-login',
    '/auth/student-register',
    '/auth/verify-code',
    '/grade/find-grade-id-and-name',
    '/school/find-Name-Id',
    '/subject/select-subject-nam-and-id',
]; // 修复URL格式

const uniReq = ({ url, method = 'GET', data = {}, headers = {}, timeout = 10000 }) => {
    uni.showLoading({
        title: '请稍后...',
        mask: false
    })
    // 如果是白名单中的接口，不添加token
    console.log('接口信息', url);
    const inWhiteList = WHITE_LIST.some(api => url.includes(api));
    console.log('是否在白名单中:', inWhiteList);
    const loadingTimer = setTimeout(() => {
        uni.hideLoading();
        uni.showToast({
            title: '请求超时，请稍后重试',
            icon: 'none'
        })
    }, timeout + 1000)//多留1s，防止误触

    // 白名单接口跳过 token 校验
    let token = ''; // 修复重复声明问题
    if (!inWhiteList) {
        token = getToken();
        console.log('获取到的token:', token);
        if (!token) {
            uni.navigateTo({ url: '/pages/login/login' });
            clearTimeout(loadingTimer);//清除loading定时器
            return Promise.reject('用户未登录');
        }
    } else {
        token = getToken() || ''; // 白名单接口传空字符串
    }

    const clientId = uni.getStorageSync('clientId') || '';

    return new Promise((resolve, reject) => {
        uni.request({
            url: BASE_URL + url,
            method,
            data,
            header: {
                // 配置默认请求头
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ' + token,
                'clientId': clientId,
                ...headers
            },
            timeout,
            success: (res) => {
                console.log('请求成功响应:', res);
                clearTimeout(loadingTimer);//清除loading定时器
                if (res.data.status === 200) {
                    resolve(res.data)
                } else if (res.data.status === 401) {
                    removeToken()//移除本地存储的token
                    uni.removeStorageSync('name')//移除本地存储的name
                    uni.removeStorageSync('phone')//移除本地存储的phone
                    uni.showToast({
                        title: res.data.message || '登录信息过期，请重新登录',
                        icon: 'none'
                    })
                    uni.navigateTo({ url: '/pages/login/login' })//用户未登录，跳转到登录页面
                    reject('登录信息过期，请重新登录')
                } else if (res.data.status === 403) {
                    uni.showToast({
                        title: res.data.message || '您没有权限访问该资源',
                        icon: 'none'
                    })
                    reject('您没有权限访问该资源')
                } else {
                    uni.showToast({
                        title: res.data.message || '请求失败，请稍后重试',
                        icon: 'none',
                        duration: 2000
                    })
                    reject(res.data.message)
                }
            },
            fail: (err) => {
                console.log('请求失败:', err);
                clearTimeout(loadingTimer);//清除loading定时器
                reject(err); // 传递完整错误对象
            },
            complete: () => {
                clearTimeout(loadingTimer);//清除loading定时器
                uni.hideLoading();//隐藏loading提示框
            }
        })
    })
}

//默认导出方法
export default uniReq